﻿using System;
using System.Collections.Generic;
using System.Text;
using Business.Entities;
using System.Data;
using System.Data.SqlClient;

namespace Data.Database
{
    public class InscripcionAdapter:Adapter
    {
        public List<InscripcionesActuales> GetAll(int ID)
        {
            List<InscripcionesActuales> ListaAlumnos= new List<InscripcionesActuales>();
            this.OpenConnection();
            SqlCommand cmdGetAll = new SqlCommand("select ai.id_inscripcion, m.desc_materia, c.id_comision, c.anio_calendario, ai.condicion, ai.id_curso, ai.nota " + 
                "from alumnos_inscripciones ai inner join cursos c on c.id_curso=ai.id_curso inner join materias m on m.id_materia=c.id_materia " +
                "where id_alumno=@id",sqlConn);
            cmdGetAll.Parameters.Add("@id", typeof(int)).Value = ID;
            SqlDataReader reader = cmdGetAll.ExecuteReader();
            while (reader.Read())
            {
                InscripcionesActuales Actual = new InscripcionesActuales();
                Actual.DescMateria = reader["desc_materia"].ToString();
                Actual.Condicion=reader["condicion"].ToString();
                Actual.Anio = (int)reader["anio_calendario"];
                Actual.Comision=(int)reader["id_comision"];
                Actual.IDAlumno = ID;
                Actual.IDInscripcion=(int)reader["id_inscripcion"];
                Actual.IDCurso = (int)reader["id_curso"];
                /*if (reader["nota"] != null)
                {
                    Actual.Nota = (int)reader["nota"];
                }
                else
                {
                    Actual.Nota = 0;
                }*/
                ListaAlumnos.Add(Actual);
            }
            reader.Close();
            this.CloseConnection();
            return ListaAlumnos;
        }

        public List<ParaMostrarEnInscripcion> GetAllCursos(int anio)
        {
            this.OpenConnection();
            List<ParaMostrarEnInscripcion> ListaMuestra=new List<ParaMostrarEnInscripcion>();
            SqlCommand cmdCursos = new SqlCommand("select m.desc_materia, c.id_comision, c.anio_calendario, c.cupo, c.id_curso " +
                "from cursos c inner join materias m on m.id_materia=c.id_materia where c.anio_calendario=@anio and cupo>1",sqlConn);
            cmdCursos.Parameters.Add("@anio", typeof(int)).Value = anio; ;
            SqlDataReader reader = cmdCursos.ExecuteReader();
            while (reader.Read())
            {
                ParaMostrarEnInscripcion curAct = new ParaMostrarEnInscripcion();
                curAct.IDCurso = (int)reader["id_curso"];
                curAct.NombreMateria = reader["desc_materia"].ToString();
                curAct.Comision = (int)reader["id_comision"];
                curAct.Anio=(int)reader["anio_calendario"];
                curAct.Cupo = (int)reader["cupo"];
                ListaMuestra.Add(curAct);
            }
            reader.Close();
            this.CloseConnection();
            return ListaMuestra;
        }

        public void Save(Persona per, Curso cur)
        {
            this.OpenConnection();
            string descrip="";

            //Busca materia
            SqlCommand cmdSel = new SqlCommand("select m.desc_materia from materias m inner join cursos c on m.id_materia=c.id_materia " +
            "where id_curso=@id", sqlConn);
            cmdSel.Parameters.Add("@id",typeof(int)).Value=cur.ID;
            SqlDataReader reader= cmdSel.ExecuteReader();
            while (reader.Read())
            {
                descrip = reader["desc_materia"].ToString();
            }
            reader.Close();

            //Agrega
            SqlCommand cmdNew = new SqlCommand("insert into alumnos_inscripciones(id_alumno, id_curso, condicion)  "
                + "values(@idalum, @idcur, @con)",sqlConn);
            cmdNew.Parameters.Add("@idalum",typeof(int)).Value=per.ID;
            cmdNew.Parameters.Add("@idcur",typeof(int)).Value=cur.ID;
            cmdNew.Parameters.Add("@con",typeof(string)).Value="Cursando";
            cmdNew.ExecuteNonQuery();

            //Actualiza Cupo
            SqlCommand cmdCupo = new SqlCommand("update cursos set cupo=(cupo-1) where id_curso=@id",sqlConn);
            cmdCupo.Parameters.Add("@id", typeof(int)).Value = cur.ID;
            cmdCupo.ExecuteNonQuery();
            this.CloseConnection();           
        }

        public List<int> GetAnio()
        {
            List<int>Lista=new List<int>();
            this.OpenConnection();
            SqlCommand cmd = new SqlCommand("select distinct anio_calendario from cursos",sqlConn);
            SqlDataReader reader = cmd.ExecuteReader();
            while (reader.Read())
            {
                int anio = (int)reader["anio_calendario"];
                Lista.Add(anio);
            }
            return Lista;
        }

        public Curso GetOne(int idCurso)
        {
            this.OpenConnection();
            Curso curAct = new Curso();
            SqlCommand cmdSelectCurso = new SqlCommand("select * from cursos where id_curso=@id",sqlConn);
            cmdSelectCurso.Parameters.Add("@id",typeof(int)).Value=idCurso;
            SqlDataReader reader = cmdSelectCurso.ExecuteReader();
            while (reader.Read())
            {
                curAct.ID = (int)reader["id_curso"];
                curAct.AnioCalendario=(int)reader["anio_calendario"];
                curAct.Cupo = (int)reader["cupo"];
                curAct.IDComision = (int)reader["id_comision"];
                curAct.IDMateria = (int)reader["id_materia"];
            }
            reader.Close();
            this.CloseConnection();
            return curAct;
        }

        public void Delete(int insc,Curso cur)
        {
            //Elimina Inscripcion
            this.OpenConnection();
            SqlCommand cmdDelete = new SqlCommand("delete from alumnos_inscripciones where id_inscripcion=@id",sqlConn);
            cmdDelete.Parameters.Add("@id",typeof(int)).Value=insc;
            cmdDelete.ExecuteNonQuery();
            
            //Actualiza Cupo
            SqlCommand cmdCupo = new SqlCommand("update cursos set cupo=(cupo+1) where id_curso=@id", sqlConn);
            cmdCupo.Parameters.Add("@id", typeof(int)).Value = cur.ID;
            cmdCupo.ExecuteNonQuery();
            this.CloseConnection();           
        }

        public List<CursoD> GetCursosInsc(Persona per)
        {
            this.OpenConnection();
            SqlCommand cmd = new SqlCommand("select c.id_curso, c.id_materia, c.id_comision, c.anio_calendario from cursos c inner join docentes_cursos dc "+
            "on dc.id_curso=c.id_curso and id_docente=@doc",sqlConn);
            cmd.Parameters.Add("@doc",typeof(int)).Value=per.ID;
            SqlDataReader reader = cmd.ExecuteReader();
            List<Curso> ListaCurso = new List<Curso>();
            List<CursoD> ListaCursoD = new List<CursoD>();
            while (reader.Read())
            {
                Curso curAct = new Curso();
                curAct.ID = (int)reader["id_curso"];
                curAct.IDComision = (int)reader["id_comision"];
                curAct.IDMateria=(int)reader["id_materia"];
                curAct.AnioCalendario = (int)reader["anio_calendario"];
                curAct.Cupo = 0;
                ListaCurso.Add(curAct);
            }
            reader.Close();
            this.CloseConnection();
            foreach (Curso c in ListaCurso)
            {
                CursoD cursoActual = new CursoD();
                cursoActual.ID = c.ID;
                cursoActual.Anio = c.AnioCalendario;
                CursoAdapter curAdap = new CursoAdapter();
                cursoActual.Materia = curAdap.GetDescripMateria(c.ID);
                cursoActual.Comision = curAdap.GetDescripComision(c.ID);
                cursoActual.Cupo = c.Cupo;
                ListaCursoD.Add(cursoActual);
            }

            return ListaCursoD;

        }
    }
}
